package com.ycsj.common.appupdate;

import android.app.Activity;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.util.Log;

import com.ycsj.common.R;
import com.ycsj.common.base.BaseApplication;
import com.vector.update_app.UpdateAppBean;
import com.vector.update_app.UpdateAppManager;
import com.vector.update_app.UpdateCallback;
import com.vector.update_app.listener.ExceptionHandler;
import com.vector.update_app.listener.IUpdateDialogFragmentListener;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import java.io.StringReader;

/**
 * 版本更新的工具类
 * 在四个端的主页面调用即可
 * Created by Administrator on 2018/7/19 0019.
 */

public class AppUpdateUtil {

    //比较服务器APK版本的URL地址
    public static final String APKVERSONURL = "http://139.129.57.83:8080/Appandroid/updateinfo.xml";

    /**
     * 检查版本更新
     *
     * @param activity 当前activity对象
     */
    public static void updateVersion(final Activity activity) {

        new UpdateAppManager
                .Builder()
                //必须设置，当前Activity
                .setActivity(activity)
                //必须设置，实现httpManager接口的对象
                .setHttpManager(new UpdateAppHttpUtil())
                //必须设置，更新地址
                .setUpdateUrl(APKVERSONURL)
                //全局异常捕获
                .handleException(new ExceptionHandler() {
                    @Override
                    public void onException(Exception e) {
                        e.printStackTrace();
                    }
                })
                //以下设置，都是可选
                //设置请求方式，默认get
                .setPost(false)
                //不显示通知栏进度条
//                .dismissNotificationProgress()
                //是否忽略版本
//                .showIgnoreVersion()
                //添加自定义参数，默认version=1.0.0（app的versionName）；apkKey=唯一表示（在AndroidManifest.xml配置）
//                .setParams(params)
                //设置点击升级后，消失对话框，默认点击升级后，对话框显示下载进度，如果是强制更新，则设置无效
                .hideDialogOnDownloading()
                //设置头部，不设置显示默认的图片，设置图片后自动识别主色调，然后为按钮，进度条设置颜色
                .setTopPic(R.mipmap.top_8)
                //为按钮，进度条设置颜色。
                .setThemeColor(0xffffac5d)
                //设置apk下砸路径，默认是在下载到sd卡下/Download/1.0.0/test.apk
//                .setTargetPath(path)
                //设置appKey，默认从AndroidManifest.xml获取，如果，使用自定义参数，则此项无效
//                .setAppKey("ab55ce55Ac4bcP408cPb8c1Aaeac179c5f6f")
                .setUpdateDialogFragmentListener(new IUpdateDialogFragmentListener() {
                    @Override
                    public void onUpdateNotifyDialogCancel(UpdateAppBean updateApp) {
                        //用户点击关闭按钮，取消了更新，如果是下载完，用户取消了安装，则可以在 onActivityResult 监听到。

                    }
                })
                //不自动，获取
//                .setIgnoreDefParams(true)
                .build()

                //检测是否有新版本
                .checkNewApp(new UpdateCallback() {
                    /**
                     * 解析json,自定义协议
                     *
                     * @param json 服务器返回的json
                     * @return UpdateAppBean
                     */
                    @Override
                    protected UpdateAppBean parseJson(String json) {
                        UpdateAppBean updateAppBean = null;
                        try {
                            //以下是服务器返回的xml方式进行解析
                            updateAppBean = parseXML2JavaBean(json);
                        } catch (Exception e) {
                            e.printStackTrace();
                            Log.i("test", "解析版本XML数据错误");
                        }

                        if (updateAppBean != null) {
                            Log.i("test","服务器最新版本："+updateAppBean.getNewVersion());
                            Log.i("test","当前版本："+getVersionName());
                            if (!getVersionName().equals(updateAppBean.getNewVersion())) {
                                //服务器的版本号与当前APP的版本号不一致的情况下更新
                                //（必须）是否更新Yes,No
                                updateAppBean.setUpdate("Yes")
                                        .setUpdateDefDialogTitle(String.format("是否升级到%s版本？", updateAppBean.getNewVersion()));
                            } else {
                                updateAppBean.setUpdate("No");
                            }
                        }

                        //以下是服务器返回的json方式进行解析
//                        try {
////                            JSONObject jsonObject = new JSONObject(json);
////                            final String newVersion = jsonObject.optString("new_version");
////                            updateAppBean
////                                    //（必须）是否更新Yes,No
////                                    .setUpdate(jsonObject.optString("update"))
////                                    //（必须）新版本号，
////                                    .setNewVersion(newVersion)
////                                    //（必须）下载地址
////                                    .setApkFileUrl(jsonObject.optString("apk_file_url"))
////                                    //测试下载路径是重定向路径
//////                                    .setApkFileUrl("http://openbox.mobilem.360.cn/index/d/sid/3282847")
//////                                    .setUpdateDefDialogTitle(String.format("AppUpdate 是否升级到%s版本？", newVersion))
////                                    //（必须）更新内容
//////                                    .setUpdateLog(jsonObject.optString("update_log"))
////                                    //测试内容过度
//////                                    .setUpdateLog("测试")
////                                    .setUpdateLog("1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16")
//////                                    .setUpdateLog("今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说\r\n")
////                                    //大小，不设置不显示大小，可以不设置
////                                    .setTargetSize(jsonObject.optString("target_size"))
////                                    //是否强制更新，可以不设置
////                                    .setConstraint(true)
////                                    //设置md5，可以不设置
////                                    .setNewMd5(jsonObject.optString("new_md5"));
//                        } catch (Exception e) {
//                            e.printStackTrace();
//                        }
                        return updateAppBean;
                    }

                    @Override
                    protected void hasNewApp(UpdateAppBean updateApp, UpdateAppManager updateAppManager) {
                        updateAppManager.showDialogFragment();
                    }

                    /**
                     * 网络请求之前
                     */
                    @Override
                    public void onBefore() {
                    }

                    /**
                     * 网路请求之后
                     */
                    @Override
                    public void onAfter() {
                    }

                    /**
                     * 没有新版本
                     */
                    @Override
                    public void noNewApp(String error) {
//                        Toast.makeText(activity, "没有新版本", Toast.LENGTH_SHORT).show();
                    }
                });

    }

    /**
     * 解析XML版本信息
     * 获取APP更新库需要的模型数据
     *
     * @param xmlString
     * @return
     */
    private static UpdateAppBean parseXML2JavaBean(String xmlString) {
        UpdateAppBean updateAppBean = null;
        try {
            // 创建解析器工厂对象
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            // 使用工石对象产生解析器对象
            XmlPullParser parser = factory.newPullParser();
            // 设置解析的源。要解析的内容
            parser.setInput(new StringReader(xmlString));
            // 获取事件类型
            int type = parser.getEventType();

            while (type != XmlPullParser.END_DOCUMENT) {
                switch (type) {
                    case XmlPullParser.START_TAG:
                        if ("updateinfo".equals(parser.getName())) {
                            updateAppBean = new UpdateAppBean();
                        } else if ("versionName".equals(parser.getName())) {
                            updateAppBean.setNewVersion(parser.nextText());
                        } else if ("url".equals(parser.getName())) {
                            updateAppBean.setApkFileUrl(parser.nextText());
                        } else if ("description".equals(parser.getName())) {
                            updateAppBean.setUpdateLog(parser.nextText());
                        }
                        break;
                    default:
                        break;
                }
                // 推进
                type = parser.next();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return updateAppBean;
    }

    /**
     * 显示应用的版本号
     */
    private static String getVersionName() {
        PackageManager packageManager = BaseApplication.context.getPackageManager();
        String versionName = null;
        try {
            PackageInfo packageInfo = packageManager.getPackageInfo(
                    BaseApplication.context.getPackageName(), 0);
            versionName = packageInfo.versionName;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return versionName;
    }

}
